const { app, BrowserWindow, ipcMain, Menu, Tray, shell, screen } = require('electron');
const path = require('path');
const isDev = require('electron-is-dev');
const isMac = process.platform === 'darwin';
// 定义全局变量
let mainWindow;
let chatlistView;
let newMessageView;
let tray;
let timer = null;
let newMessageViewTimer = null;
let isOpenNewMessageView = false;

// 配置主页路径
const devUrl = 'http://localhost:3000';
const localUrl = `file://${path.join(__dirname, '/index.html')}`;
const appUrl = isDev ? devUrl : localUrl;

// 配置与加载的js文件
const devPreUrl = path.join(__dirname, '../public/renderer.js');
const localPreUrl = path.join(__dirname, '/renderer.js');
const preloadScriptUrl = isDev ? devPreUrl : localPreUrl;

// 定义任务栏图片地址，window要求ico格式，mac要求png格式
const devIconPath = path.join(__dirname, isMac ? '../public/favicon.png' : '../public/favicon.ico');
const devEmptyIconPath = path.join(__dirname, isMac ? '../public/empty.png' : '../public/empty.ico');
const iconPath = isDev ? devIconPath : path.join(__dirname, isMac ? '/favicon.png' : '/favicon.ico');
const emptyIconPath = isDev ? devEmptyIconPath : path.join(__dirname, isMac ? '/empty.png' : '/empty.ico');

// 自动更新处理
// const updater = require('./autoUpdate');

// 加载全局配置
require('./global');
// 主线程订阅渲染进程的监听
require('./listener');

function getDownloadUrl(baseUrl) {
    return `${baseUrl}/download/lifaweb/`;
}

ipcMain.on('on-ignore-all', function (event) {
    newMessageView.hide();
    isOpenNewMessageView = false;
    clearInterval(newMessageViewTimer);
    newMessageViewTimer = null;
});

ipcMain.on('set-goPage', function (event, data) {
    if (data && data.isChild) {
        if (chatlistView) {
            chatlistView.destroy();
            chatlistView = null;
        }
        if (newMessageView && newMessageView.isVisible()) {
            newMessageView.hide();
            isOpenNewMessageView = false;
            clearInterval(newMessageViewTimer);
            newMessageViewTimer = null;
        }
    }
    // 如果是用event的发送事件，子窗口的事件无法发送回到主窗口
    // event.sender.send('web-goPage', data);
    mainWindow.webContents.send('web-goPage', data);
});

ipcMain.on('openDevTools', function () {
    mainWindow.webContents.openDevTools();
});

ipcMain.on('login', function (event, data) {
    global.store.set(data);
    global.isAllowLogin = true;
    global.canClose = true;
    mainWindow.close();
    // 设置 setTimeout , 避免与关闭登录窗口事件冲突
    setTimeout(() => {
        openHomeWindow();
    }, 100);
});

ipcMain.on('logout', function () {
    if (global.isAllowLogin && mainWindow) { // 避免render进程在token过期的时候会调用多次这个方法
        global.store.set({ dateStr: '' });
        global.store.set({ token: false });
        global.isAllowLogin = false;
        global.canClose = true;
        mainWindow.close();
        // 设置 setTimeout , 避免与关闭登录窗口事件冲突
        setTimeout(() => {
            openLoginWindow();
        }, 100);
    }
});

// 手动下载新版本
ipcMain.on('openlinkurl', function (event, baseUrl) {
    const url = getDownloadUrl(baseUrl);
    const isOpenSuccess = shell.openExternal(`${url}lifa.exe`);
    if (isOpenSuccess) {
        mainWindow.destroy();
        mainWindow = null;
        if (newMessageView) {
            newMessageView.destroy();
            newMessageView = null;
        }
        global.store.set({ dateStr: '' });
        global.store.set({ token: false });
        global.isAllowLogin = false;
        if (tray) {
            tray.destroy();
            mainWindow = null
        }
        app.quit();
    }
});

// 登录窗口最小化
ipcMain.on('window-min', function (event, data) {
    if (data && data.isChild) {
        chatlistView.minimize();
        return;
    }
    mainWindow.minimize();
});
// 登录窗口最大化
ipcMain.on('window-max', function (event, data) {
    if (data && data.isChild) {
        if (chatlistView.isMaximized()) {
            chatlistView.restore();
        } else {
            chatlistView.maximize();
        }
        return;
    }

    if (mainWindow.isMaximized()) {
        mainWindow.restore();
    } else {
        mainWindow.maximize();
    }
});
// 关闭窗口设置隐藏
ipcMain.on('window-close', function (event, data) {
    if (data && data.isChild) {
        chatlistView.close();
        return;
    }
    mainWindow.close();
});

// 监听新消息然后闪烁logo
ipcMain.on('window-new-msg', function (event) {
    const visible = mainWindow.isVisible();
    const min = mainWindow.isMinimized();
    const focus = mainWindow.isFocused();
    if (!visible || min || !focus) {
        if (timer) return;
        shell.beep();
        let count = 0;
        mainWindow.flashFrame(true);
        timer = setInterval(function () {
            try {
                count++;
                if (count % 2 === 0) {
                    tray.setImage(emptyIconPath);
                } else {
                    tray.setImage(iconPath);
                }

                // 窗口被销毁
                if (mainWindow.isDestroyed()) {
                    tray.setImage(iconPath);
                    clearInterval(timer);
                    timer = null;
                    return;
                }
                // 正常情况
                if (mainWindow.isVisible() && !mainWindow.isMinimized() && mainWindow.isFocused()) {
                    mainWindow.flashFrame(false);
                    tray.setImage(iconPath);
                    clearInterval(timer);
                    timer = null;
                }
            } catch (error) {
                console.log(JSON.stringify(error))
            }
        }, 500);
    }
});

const baseWindowConfig = {
    show: false,
    frame: false,
    titleBarStyle: 'hidden',
    width: 800,
    height: 600,
    backgroundColor: '#ffffff', // 设置启动的背景颜色
    webPreferences: {
        webSecurity: false, // 跨域问题，浏览器安全策略
        javascript: true,
        plugins: true,
        nodeIntegration: false, // 不集成 Nodejs
        preload: preloadScriptUrl// 但预加载的js文件内仍可以使用 Nodejs 的 API
    },
}

// 创建聊天记录子窗口
ipcMain.on('create-chatlist-view', function (event, globalSearchParams) {
    if (chatlistView) {
        chatlistView.destroy();
        chatlistView = null;
    }
    const mainWinBounds = mainWindow.getBounds();
    const height = 700;
    const mainWinHeight = mainWinBounds.height;
    const y = mainWinHeight - height + mainWinBounds.y;
    const x = 334 + mainWinBounds.x;
    chatlistView = new BrowserWindow({
        ...baseWindowConfig,
        // resizable: false,
        // fullscreen: false,
        x, y, height,
        width: 780,
    });
    global.store.set({ [chatlistView.id]: 'chatlistview', globalSearchParams });
    chatlistView.loadURL(appUrl);
    // chatlistView.webContents.openDevTools();
    chatlistView.once('ready-to-show', () => {
        chatlistView.show();
    })
});

function createMessageView() {
    newMessageView = new BrowserWindow({
        ...baseWindowConfig,
        height: 100, width: 240,
        alwaysOnTop: true,
        resizable: true
    });
    global.store.set({ [newMessageView.id]: 'newMessageView' });
    newMessageView.loadURL(appUrl);
}

/**
* 定义方法
*/
function openLoginWindow() {
    createWindow({
        width: 280,
        height: 400,
        resizable: true
    }, true);
}

function openHomeWindow() {
    createWindow({
        width: 945 + 350,
        height: 735,
        minWidth: 1110,
        minHeight: 550
    }, false);
    createMessageView();
}

function createWindow(winConfig = {}, isLogin) {
    global.canClose = false;
    mainWindow = new BrowserWindow({
        ...baseWindowConfig,
        ...winConfig
    })
    global.store.set({ [mainWindow.id]: 'mainwin' });

    // 要搭配show: false来使用
    mainWindow.once('ready-to-show', () => {
        mainWindow.show();
    })

    // 然后加载应用的 index.html。
    mainWindow.loadURL(appUrl);

    // Open the DevTools.
    // mainWindow.webContents.openDevTools();
    isDev && mainWindow.webContents.openDevTools();


    mainWindow.on('close', function (event) {
        // global.sendDebugMsg(mainWindow, '----close close close----');
        if (!global.canClose) { // 阻止窗口关闭
            mainWindow.hide();
            mainWindow.setSkipTaskbar(true);
            event.preventDefault();
        }
    });
    // 当 window 被关闭，这个事件会被触发。
    mainWindow.on('closed', function () {
        // global.sendDebugMsg(mainWindow, '----closed closed closed----');
    });

    // 创建通知栏菜单
    createNotificationBarMenu();

    if (!isLogin) {
        // if (isMac) return;
        // 非苹果系统注册自动更新
        // updater.updateHandle(mainWindow, getDownloadUrl);
    }
}

function createNotificationBarMenu() {
    if (tray) return;

    const eventText = isMac ? 'right-click' : 'click';
    // 创建系统通知区菜单/系统托盘图标/任务通知栏图标/右下角图标
    tray = new Tray(iconPath);
    const contextMenu = Menu.buildFromTemplate([
        {
            label: '退出',
            click: () => {
                //我们需要在这里有一个真正的退出（这里直接强制退出）
                mainWindow.destroy();
                mainWindow = null;
                if (newMessageView) {
                    newMessageView.destroy();
                    newMessageView = null;
                }
                global.store.set({ dateStr: '' });
                global.store.set({ token: false });
                global.isAllowLogin = false;
                if (tray) {
                    tray.destroy();
                    mainWindow = null
                }
                app.quit();
            }
        },
    ]);
    tray.setContextMenu(contextMenu);
    tray.on(eventText, () => {
        if (mainWindow.isMinimized() && !mainWindow.isVisible()) { // 最小化并且隐藏 => 恢复原来大小并显示
            mainWindow.restore();
            mainWindow.show();
            mainWindow.focus();
            mainWindow.setSkipTaskbar(false);
        } else if (mainWindow.isMinimized()) { // 最小化 => 恢复原来大小
            mainWindow.restore();
            mainWindow.focus();
            mainWindow.setSkipTaskbar(false);
        } else if (mainWindow.isVisible()) { // 显示 => 隐藏
            mainWindow.hide()
            mainWindow.setSkipTaskbar(true);
        } else { // 隐藏 => 显示
            mainWindow.show();
            mainWindow.focus();
            mainWindow.setSkipTaskbar(false);
        }
    });
    tray.on('mouse-move', () => {
        if (isOpenNewMessageView) return;
        // 订阅接收mainWindow新消息列表回调
        ipcMain.once('on-accept-new-message', function (event, data) {
            // 计算newMessageView显示位置
            const { x: tx, y: ty, width: tw, height: th } = tray.getBounds();
            const height = data.height, width = 260;
            const { bounds: { width: ww } } = screen.getPrimaryDisplay();
            const maxX = ww - width;
            const minY = height;
            let x, y;
            if (isMac) {
                x = tx;
                y = th
            } else {
                // 需要判断任务栏位置上下左右
                x = tx > maxX ? maxX : (tx < width ? 0 : tx); // 左右下的判断
                y = ty < minY ? (ty + th) : (ty - height); // 顶部判断
            }

            if (data.totalMsgCount && data.totalMsgCount > 0) {
                // 先传数据到newMessageView渲染
                newMessageView.webContents.send('on-set-new-message', data);
                newMessageView.setBounds({ x, y, height, width });
                newMessageView.show();
            }
            // 通过定时器判断鼠标位置隐藏newMessageView
            newMessageViewTimer = setInterval(function () {
                const { x: cx, y: cy } = screen.getCursorScreenPoint();
                const isInTray = cx > tx && cx < (tx + tw) && cy > ty && cy < (ty + th);
                const isInMsgView = cx > x && cx < (x + width) && cy > y && cy < (y + height);
                if (!(isInTray || isInMsgView)) {
                    newMessageView && newMessageView.hide();
                    clearInterval(newMessageViewTimer);
                    newMessageViewTimer = null;
                    isOpenNewMessageView = false;
                }
            }, 1000);
        });
        isOpenNewMessageView = true;
        // 请求回去新消息列表
        mainWindow.webContents.send('on-get-new-message');
    })
}

/**
* 请求加锁，只能创建一个实例
*/
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
    app.quit();
} else {
    app.on('second-instance', () => {
        if (mainWindow) {
            if (mainWindow.isMinimized() && !mainWindow.isVisible()) { // 最小化并且隐藏 => 恢复原来大小并显示
                mainWindow.restore();
                mainWindow.show();
                mainWindow.setSkipTaskbar(false);
            } else if (mainWindow.isMinimized()) { // 最小化 => 恢复原来大小
                mainWindow.restore();
                mainWindow.setSkipTaskbar(false);
            } else if (!mainWindow.isVisible()) { // 隐藏 => 显示
                mainWindow.show();
                mainWindow.setSkipTaskbar(false);
            }
            mainWindow.focus();
        }
    })
}

/**
* 启动页面和订阅监听
*/
app.on('ready', () => {
    global.platform = process.platform;
    const token = global.store.get('token');
    if (token) {
        global.isAllowLogin = true;
        openHomeWindow();
    } else {
        openLoginWindow();
    }
    // 休眠状态处理
    const { powerMonitor } = require('electron');
    powerMonitor.on('suspend', () => {
        global.sendDebugMsg(mainWindow, 'The system is going to suspend');
    })
    powerMonitor.on('resume', () => {
        mainWindow.webContents.send('on-resume');
    })
});

// 当全部窗口关闭时退出。
// 如果你没有监听此事件并且所有窗口都关闭了，默认的行为是控制退出程序
app.on('window-all-closed', () => { });

app.on('open-file', e => {
    e.preventDefault();
});

app.on('open-url', e => {
    e.preventDefault();
});
